home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSXSRC.LZH
/
LBSRC.LZH
/
CDC.MAC
next >
Wrap
Text File
|
1995-03-20
|
15KB
|
575 lines
*-<□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□>-
*
* 常駐型 オーディオCD コントローラー
*
* CDC.x
*
* Copyright 1994 1995 TNB製作所
*
*
*
* 基本的にTRAP #5はSCSIを使うのがあるので、OPM割り込みなどでで使った
* りしないこと(基本的にはね)
*
*
CDC macro callname
moveq.l #callname,d0
trap #5
endm
_CDC_CHK_ macro
.local _CC1,_CC2,_CC3
movem.l d0/a0/a1,-(sp)
suba.l a1,a1
moveq #$81,d0
trap #15
movea.l d0,a1
movea.l $25*4.w,a0 *一つ前のポインタ
cmpa.l #$00F00000,a0
bcc _CC2
cmp.l #'CDC_',-8(a0)
bne _CC2
cmp.l #'trap',-4(a0)
bne _CC2
moveq #$81,d0
trap #15
moveq #-1,d0 *常駐
bra _CC3
_CC2:
moveq #$81,d0
trap #15
moveq #0,d0 *非常駐
_CC3:
movem.l (sp)+,d0/a0/a1
.endm
*---------------------------------------------------
* ドライバー常駐チェック
* trap5のベクタアドレス-8から'CDC_trap'があるかをチェック
* (アドレス+2から各ルーチンアドレスが列ぶ)
* マクロ _CDC_CHK_ が用意してある(USERモードで使うこと)
*
* _CDC_CHK_
* beq 非常駐
* bne 常駐
*
*---------------------------------------------------
*
* SYSTEM 関係
*
_CDC_VERSION equ $00
*
* ・ドライバーのバージョンチェック
*
* [引 数] なし
* [戻り値] d0.l = $0101
*
_CDC_INIT equ $01
*
* ・CD 及び ドライバーの初期化をします。([CLR]キー同等)
*
* [引 数] なし
* [戻り値] なし
*
* 演奏中止し、モードもクリアします。ただし、プログラム
* は残ります。
*
* [参 考] CD-ROMに対し REZEROUNIT を送りますので多少時間のか
* かる場合があります。割り込み中など処理を早くしたい場
* 合、_CDC_STOP を使用するといいでしょう。
*
*---------------------------------------------------
*
* ワークアドレスゲット 関係
*
_CDC_STAT equ $02
*
* ・CDの現在の状態の書かれたアドレスを返す
*
* [引 数] なし
* [戻り値] d0.l = ワークアドレス
*
* ( 0) .dc.w 0;NoCD 1;SetCD
* ( 2) .dc.l 状態 0x11;演奏中,0x12;一時停止,0x13;停止
* ( 6) .dc.l 曲番号
* (10) .dc.l 演奏中の曲の経過時間 (MSF型)
* (14) .dc.l CD絶対総 経過時間 (MSF型)
* (18) .dc.l 現在演奏曲のながさ (MSF型)
* (22) .dc.l CD名アドレス
* (26) .dc.l 曲名アドレス
* (30) .dc.l LED文字アドレス -----以下LED部に表示される物
* (34) .dc.l LED数値 曲番号
* (38) .dc.l LED数値 1以上;プログラムナンバー
* 0;表示無し -1;MAX= -2;INP=
* (42) .dc.l LED数値 タイム (MSF型)
* (46) .dc.l LEDの状態
* ┌bit 0 ■:停止
* │bit 1 >:再生
* │bit 2 ||:一時停止
* イズレカ│bit 3 >>:早送り
* └bit 4 <<:巻き戻し
* ┌bit 5 ⊂:オート
* └bit 6 ◯:リピート
* bit 7 R:ランダム
* bit 8 M:メモリー
* (bit 9 B:BGM)
* (bit31 RV:TIME REV)
* (50) .dc.b 入力されている数値(上)
* (51) .dc.b 入力されている数値(下)
*
* 表示LED文字アドレスは基本的に同じアドレスを返してく
* る。内容が変わったかどうかは曲名アドレスを監視するこ
* とで可能。
*
* CDの現在の状態の書かれたアドレスを返します。アドレスは固定さ
* れてますが、トラップの再更新されます。
*
* LED数値 タイムは TIMEREV.モードになっていてもREV.される前の
* 数値がかえります。対応したい場合LEDの状態でチェック、計算し
* てください。
*
* [参 考] CDC の機能が停止ているばあい同じ値を返します。
* (LED文字アドレスも0の時もあります。)
* _CDC_POWER($35)でチェックしてください。
*
_CDC_TRACKS equ $03
*
* ・CD-DAのCDの総合時間、曲数、曲の演奏時間、曲名の書かれたアドレスを返す
*
* [引 数] なし
* [戻り値] d0.l = 曲名リストワークアドレス
*
* ( 0) .dc.w 0;NoCD 1;SetCD
* ( 2) .dc.l CDCの最大記憶数(以下,記憶数)
* ( 6) .dc.l CDの曲数
* (10) .dc.l CDの全演奏時間
* (14) .dc.l CDCLISTにあったか -1ならあった
* (18) .dcb.b 40,0 CD名 40-1文字
* (58) .dsb.b (記憶数)*40 各曲の名前 40-1文字
* .dsb.l (記憶数) 各曲の演奏時間+拡張曲名flag
* .dsb.l (記憶数) 各曲のスタート時間
* (最上位ビットが立って入れば データトラック)
*
* CD名、曲名以外の書き替えを禁止。名の最後は必ず0を付ける
*
*---------------------------------------------------
*
* 外部コントロール用 関係
*
_CDC_SCSI_CHK equ $04
*
* ・SCSIの状態を返します。
*
* [引 数] なし
* [戻り値] d0.l = 0 ; 使用可能
* < 0 ; 使用不可
*
* TRAP #5でSCSIを使用するもの場合このコールでチェックしてか
* ら使用してください。
*
_CDC_RELED equ $05
*
* ・LED部の書き書き直しをします。数値入力のキャンセルも行います。
*
* [引 数] なし
* [戻り値] なし
*
* LEDの書き直しを行います。TRAP #5 でCDCを操作した場合
* すぐにLED部(_CDC_STAT のワークも含む)に表れないもの
* があります。TIMER-Cが生きている場合一秒以内には書き
* 直されますが、このコールを使えばすぐに書き直されます。
*
* また、入力された数値のキャンセルも行います。
*
* [参 考] CDCコール番号の $1? はすぐに書き直されるようになって
* ます。
*
*---------------------------------------------------
*
* キーコントロール 関係
*
_CDC_INKEY equ $07
*
* ・CDCのキー割り込みルーチンを呼びます
*
* [引 数] d1.b = キーボードコード
* [戻り値] なし
*
* キーボードのコードを送ることでCDCをコントロールします。
*
*┌─┐┌─┐ ┌─┬─┬─┐┌─┬─┬─┬─┐
*│ ││ │ ─┬──┐│ │ │ ││ │記│登│ │
*└─┘└─┘ ─┴──┘└━┴━┴━┘└━┴─┴─┴─┘
*┌─┬─┬ ─┬──┐┌─┬─┬─┐┌─┬─┬─┬─┐
*│ES│ │ │ BS ││HM│ │DL││CL│/│*│-│
*├─┴┬┴ ┬┴┬┴┬ ┬┴┬┴──┤├─┼━┼─┤├─┼─┼─┼─┤
*│ TAB│ │E│R│ │[゚│ ││RU│RD│UN││7│8│9│+│
*├──┼ ┴┬┴┬┴ ┴┬┴┐ CR │├─┼─┼─┤├─┼─┼─┼─┤
*│ │]ム│ ││ │↑│ ││4│5│6│=│
* ┴┬┴──┤│←├─┤→│├─┼─┼─┼─┤
* │ ││ │↓│ ││1│2│3│ │
* ┴┬──┘├─┴┬┴─┤├─┼─┼─┤EN│
* │ │ │ ││0│,│.│ │
* ━┘ └──┴──┘└─┴─┴─┴─┘
*
*┌─┐┌─┐ ┌─┬─┬─┐┌─┬─┬─┬─┐
*│ ││ │ ─┬──┐│ │ │ ││ │52│53│ │
*└─┘└─┘ ─┴──┘└━┴━┴━┘└━┴─┴─┴─┘
*┌─┬─┬ ─┬──┐┌─┬─┬─┐┌─┬─┬─┬─┐
*│01│ │ │ 0F ││36│ │37││3F│40│41│42│
*├─┴┬┴ ┬┴┬┴┬ ┬┴┬┴──┤├─┼━┼─┤├─┼─┼─┼─┤
*│ 10 │ │13│14│ │1C│ ││38│39│3A││43│44│45│46│
*├──┼ ┴┬┴┬┴ ┴┬┴┐ 1D │├─┼─┼─┤├─┼─┼─┼─┤
*│ │29│ ││ │3C│ ││47│48│49│4A│
* ┴┬┴──┤│3B├─┤3D│├─┼─┼─┼─┤
* │ ││ │3E│ ││4B│4C│4D│ │
* ┴┬──┘├─┴┬┴─┤├─┼─┼─┤4E│
* │ │ │ ││4F│50│51│ │
* ━┘ └──┴──┘└─┴─┴─┴─┘
*
* $3F [CLR] = CDC.x初期化
* $4E [ENT] = 演奏
* $4A [=] = PAUSE/RESUME
* $42/$46 [-][+] = 巻戻し/早送り
* $38 [R-UP] = 1曲戻し *
* $39 [R-DN] = 1曲送り
* $3A [UNDO] = リピートモード
*
* などキー操作と同じ。他に
*
* $52 [記号入力]= 数値入力キャンセル。LEDの初期化にもなる
* (CDC_RELEDと同じ機能です。)
*
* があります(キー操作では出来ないようになってます)。
*
*
* 演奏開始の場合等、他のコールと違うのは入力されている数
* 値に影響される点です。もしこのコールだけで指定の曲演奏
* したい場合、まず、数値キーコードを送ってから演奏すれば
* 可能です。
*
* [-][+](サーチキー)を使う場合は、連続で送ったあと、最後
* に 0 を送ってください。この時サーチ先から演奏されます。
*
* $38は連続でコマンドを送ったりすることで動作が違うので
* 単純に、曲の頭から、1曲戻すと言う場合 _CDC_MVPLAY($13)
* を使用してください。
*
*---------------------------------------------------
*
* プログラム関係
*
_CDC_PROG equ $08
*
* ・CDCのプログラムワークアドレスを返す
*
* [引 数] なし
* [戻り値] d0.l = メモリワークアドレス
*
* ( 0) .dc.w プログラム数
* ( 2) .ds.b 100,曲ナンバー
*
* プログラムの直接書き替えも可能。ただし、書き替えたあと
* もう一度_CDC_PROGをコールすること
*
* プログラムを全部消去したい場合、プログラム数を0
* に書き替えることで出来ます。
*
_CDC_PROGIN equ $09
*
* ・指定曲ナンバーをプログラムに記憶します
*
* [引 数] d1.l = 曲ナンバー
* = -1 ; 現在プログラムされている数のみ返す
* d2.l = プログラムナンバー (0~)
* = -1 ;プログラムの最後に追加します ([.])
* [戻り値] d0.l = 現在プログラムされている数 ; 正常終了
* < 0 ; エラー(プログラム100を越える)
*
_CDC_PROGOUT equ $0A
*
* ・最後のプログラムの曲をプログラムから消します
*
* [引 数] なし
* [戻り値] d0.l = 現在プログラムされている数 ; 正常終了
* < 0 ; エラー
*
_CDC_PROGTIME equ $0F
*
* ・プログラムされた曲の総演奏時間を計算します
*
* [引 数] なし
* [戻り値] d0.l = ワークアドレス
* < 0 ; エラー
* ( 0) .dc.l 演奏予定総長さ
* ( 4) .dc.l 演奏された曲の合計長さ
*
* プログラムされて曲の合計と演奏された曲の合計長さ
* を返します。ただし、演奏されていない時は0,0が
* かえります。
* 演奏中にプログラムの変更があると数値がおかしくな
* ることがあります(変更されない)
*
* [参 考]ランダム演奏時にも、ノーマル時にも有効。
*
*---------------------------------------------------
*
* 演奏関係
*
_CDC_PLAY equ $10
*
* ・曲ナンバー指定によりノーマル演奏開始
*
* [引 数] d1.l = 開始曲ナンバー (0ならCDC管理演奏)
* d2.l = 終了曲ナンバー (-1なら最後まで)
* [戻り値] d0.l = 0 ; 正常終了
* < 0 ; エラー
*
_CDC_PAUSE equ $11
*
* ・CD演奏の一時停止。演奏していない場合何もしません。
*
* [引 数] なし
* [戻り値] なし
*
_CDC_RESUME equ $12
*
* ・CD演奏の一時停止の解除。演奏中は何もしません。
*
* [引 数] なし
* [戻り値] なし
*
_CDC_MVPLAY equ $13
*
* ・CD演奏の曲を変えます
*
* [引 数] d1.l = 現在演奏中の曲からの ±値 (-1~1)
* [戻り値] d0.l = 0 ; 正常終了
* < 0 ; エラー
*
* 0を指定することで演奏中の曲を最初から。
* プログラムされている場合、プログラム順に曲を移動、演奏します。
* ランダムモード時は、どの曲にいくか判りません。
*
_CDC_BGM equ $14
*
* ・指定アドレス間を繰り返し演奏します
*
* [引 数] d1.l = 開始トラックor開始アドレス
* d2.l = 終了アドレス(0ならその曲の最後の数値)
* d3.l = ループアドレス(0ならd1と同じ値に)
* d4.l = ループ終了アドレス(0ならd2と同じ値に)
* [戻り値] d0.l = 0 ; 正常終了
* < 0 ; エラー
*
* d1.lは$100未満であればトラック指定になります。
* d1.lが$100以上であればアドレス指定になります。
*
* _CDC_MODE の戻り値が bit4;BGMが立ちます
*
* [参 考] 基本的に BGMとして CD を使う場合のコールなので
* LED部にBGMモードとは表示されません。
* 使う場合、キーボードからのコントロールを殺したほう
* がいいでしょう。
* ZCDC.x で使用してます。
*
_CDC_STOP equ $15
*
* ・CD演奏を停止します。
*
* [引 数] なし
* [戻り値] なし
*
* _CDC_INIT に比べ高速です。割り込み中など処理が止まる
* のを避けたい場合のみ使用してください。CDC.x内部では
* 停止になりますが、CD-ROM自体の状態は一時停止になりま
* す。また、LEDの書き替えもすぐに行われません。
*
*---------------------------------------------------
*
* CDC DRIVE MODE 関係
*
_CDC_DRIVE equ $30
*
* ・CDCの心臓を動かす TIMER-Cを乗っ取っていると、CDCが動きません。
* が、直接ある一定期でこれをコールすれば大丈夫です。
*
* [引 数] なし
* [戻り値] なし
*
* [参 考] MUTERMモード対応にも対応してます。が気にすることはないで
* しょう。
*
_CDC_MODE equ $31
*
* ・CDCの演奏モードを設定(トグル)
*
* [引 数] d1.l = モード
* = 0 ; オート
* = 1 ; リピート
* = 2 ; ランダム
* = -1 ; モードののみ返す
* [戻り値] d0.l = 現在のモード ; 正常終了
* 現在のモードは
* bit0 :オート
* bit1 :リピート
* bit2 :ランダム
* bit3 :メモリー
* [bit4 :BGM]
*
* 設定は _CDC_INKEY($7)でそれぞれのキーコードを、
* 送った時を同じ処理をします(ただし入力数字は無視
* されます)ので、場合によリ演奏開始されます。
*
* モード変更はトグルで行われるので一度モードを調
* べてから設定したほうがいいでしょう。
*
_CDC_KEYMODE equ $32
*
* ・CDCのキー操作関係のモードを設定
*
* [引 数] d1.l = モード
* 0 ; 一切受け付けない (-KS)
* 1 ; 受け付ける
* -1 ; 現在のモードのみ返す
* [戻り値] d0.l = 前のモード ; 正常終了
_CDC_LED equ $33
*
* ・CDCのLEDの表示モードを設定する
*
* [引 数] d1.l = 0 ; 表示モード
* 1 ; 非表示モード
* = -1 ; 現在の値
* [戻り値] d0.l = 前のモード ; 正常終了
* < 0 ; エラー
*
* 表示モードにしてもTEXTが使われていると表示されません
*
* [参 考] Trapコールで強制LED表示モードはありません
*
_CDC_TIMING equ $34
*
* ・CDチェックする間隔設定(基本的に使用禁止)
*
* [引 数] d1.l = 1s単位
* = -1 ; 現在の値
* [戻り値] d0.l = 前の値(単位1/10s) ; 正常終了
* < 0 ; エラー
*
* 間隔チェックにはIOCSのTIMER-Cのワークを見ているので
* TIMER-Cを変更している場合、意味がありません。
*
* [参 考] デバグ用なので使用する意味はありません。
*
_CDC_POWER equ $35
*
* ・CDC の機能を制御
*
* [引 数] d1.l = 1 ; 機能する
* = 0 ; 停止する ([ESC])
* = -1 ; 現在の値
* [戻り値] d0.l = 前の値 ; 正常終了
* < 0 ; エラー
*
* 機能を停止しても trap#5での操作も可能ですが、
* _CDC_DRIVE を常用する必要があります。
*
_CDC_TRACKMODE equ $36
*
* ・トラック記憶モードを変えます(演奏も停止します)。
*
* [引 数] d1.l = 0 ; タイトルリストファイルを参照、
* 拡張トラック設定
* = 1 ; 拡張トラック設定解除
* [戻り値] なし
*
* タイトルリストファイルからの登録を行います。タイトル
* リストファイルを変更した時これを実行すれば読み込んで
* くれます
*
* [参 考] d1.l==1 は主にZCDC.xで使用します。普通の音楽演奏の場合
* は意味がないでしょう。
*
_CDC_KEYCANSEL equ $37
*
* ・CDCのキー操作無効を個別に設定
*
* [引 数] d1.l = 無効にするキーボードコード
* = -1 ; もとに戻す
* [戻り値] なし
*
* アプリでキーボードからのコントロールが困る物がある場合、特定
* のキーのみ無効に出来ます。アプリ終了時もとに戻すこと。
*
* [参 考] スイッチ -B[n]でもとに戻すことが可能です。
*
*---------------------------------------------------
*
* CDC ERROR CORDS
*
*
* -1 ;
* -2 ; Play Audio Begin ・ Play Audio Block Count Command error'演奏できない'
* -3 ; Start Track Address or ReadTOC Command error'演奏できない'
* -4 ; 指定された曲番号は、存在しない
* -5 ; Leadout Track Address or ReadTOC Command error
* -100 ; CD-ROM でない 準備されていない
*
* 戻り値としてd0が使われていなくても破壊されます.
*
*